package io.gitee.yth.design.pattern.test.core.pattern.creational.singleton;

import java.io.Serializable;

/**
 * 6) 双重检查Double-Check
 * <p>
 * 实现懒加载，线程安全
 *
 * @author yth
 * @since 2023-04-16-20:42
 */
public class Singleton6 implements Serializable {

    /**
     * volatile禁止指令重排
     * 类的实例化：1.分配内存空间 2.设置实例数据 3.返回内存地址 4.投入使用
     * 指令重排后的可能结果：1->3->4->2
     * 不使用volatile可能造成NullPointerException
     */
    private static volatile Singleton6 instance;

    /**
     * 双重检查，既保证安全又保证效率
     */
    public static Singleton6 getInstance() {
        if (instance == null) {
            synchronized (Singleton6.class) {
                if (instance == null) {
                    instance = new Singleton6();
                }
            }
        }
        return instance;
    }

    private Singleton6() {
    }
}
